package com.feng.study.demo.juc;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;

public class AtomicDemo {
    public static void main(String[] args) {
        testAtomicInteger();
        testAtomicLongAndLongAdder();
    }

    /**
     * AtomicLong是CAS操作。LongAdder是多个单元操作。
     *
     * AtomicLong 是基于 CAS 方式自旋更新的；LongAdder 是把 value 分成若干cell，并发量低的时候，直接 CAS 更新值，成功即结束。
     * 并发量高的情况，CAS更新某个cell值和需要时对cell数据扩容，成功结束；
     * 更新失败自旋 CAS 更新 cell值。取值的时候，调用 sum() 方法进行每个cell累加。
     * AtomicLong 包含有原子性的读、写结合的api；
     * LongAdder 没有原子性的读、写结合的api，能保证结果最终一致性。
     * 低并发场景AtomicLong 和 LongAdder 性能相似，高并发场景 LongAdder 性能优于 AtomicLong。
     */
    private static void testAtomicLongAndLongAdder() {
        AtomicLong atomicLong = new AtomicLong();
        LongAdder longAdder = new LongAdder();
        longAdder.add(11);
    }

    private static void testAtomicInteger() {
        AtomicInteger atomicInteger = new AtomicInteger();
        atomicInteger.set(1);
        boolean b = atomicInteger.compareAndSet(1, 2);
        System.out.println(b);
        System.out.println(atomicInteger);
    }
}
